local AbsActExcel = require("excel.absAct")
local Lang = require("common.Lang")
local ObjHuman = require("core.ObjHuman")
local Msg = require("core.Msg")
local Broadcast = require("broadcast.Broadcast")
local Grid = require("bag.Grid")
local BagLogic = require("bag.BagLogic")
local ItemDefine = require("bag.ItemDefine")
local BuyLogic = require("topup.BuyLogic")
local AbsActDefine = require("absAct.AbsActDefine")
local AbsActLogic = require("absAct.AbsActLogic")
local Log = require("common.Log")
--[[
    absAct.xlxs-wishGift
    新英雄来袭-夙愿礼盒
        1.默认初始化礼盒数据
        2.礼盒分直购和钻石购买
    DB:
        human.db.absAct[id] = {
            premiumCnt = {
               xxx = xxx,          -- 配置的礼包id = 购买数量 
            }
        }
    public:
        initAfterHot()              -- 初始礼盒数据
        getAndSendMsg()             -- 发送活动数据
        isRed()                     -- 红点提醒
        isActive()                  -- 激活状态
        isOpen()                    -- 活动开启   、
        getLeftTime()               -- 得到活动剩余时间(YunYingLogic统一调用)
        wishGift()                  -- 直购礼盒(统一从YunYingLogic.onBuy中调用)
        giftBuy()                   -- 钻石购买礼盒
--]]

ABS_PREMIUM_GIFT_LIST_ACTID = { }   -- 所有礼盒数据配置id
ABS_PREMIUM_GIFT_LIST_BUYID = { }   -- 所有需要直购的礼盒数据 buyID => 配置id
function initAfterHot()
    ABS_PREMIUM_GIFT_LIST_ACTID = {}
    for k, v in pairs(AbsActExcel.wishGift) do
        ABS_PREMIUM_GIFT_LIST_ACTID[v.actId] = ABS_PREMIUM_GIFT_LIST_ACTID[v.actId] or { }
        ABS_PREMIUM_GIFT_LIST_ACTID[v.actId][#ABS_PREMIUM_GIFT_LIST_ACTID[v.actId] + 1] = k
        if v.buyID ~= 0 then
            ABS_PREMIUM_GIFT_LIST_BUYID[v.buyID] = k
        end
    end
end

function getAndSendMsg(human, id, actId)
    local startedFlag, endTime, startTime = AbsActLogic.isStarted(human, id)
    if not startedFlag then return end

    local absActConfig = AbsActExcel.absActivity[id]
    if not absActConfig then return end

    local absAct = human.db.absAct[id]
    if not absAct then return end

    local msgRet = Msg.gc.GC_ABS_ACT_WISH_GIFT_QUERY
    msgRet.templateId = absActConfig.panelID
    msgRet.ad = absActConfig.adIcon
    msgRet.absActId = id
    msgRet.status = absAct.status or 0

    local index = 0
    for k, giftId in pairs(ABS_PREMIUM_GIFT_LIST_ACTID[absActConfig.actId]) do
        local v = AbsActExcel.wishGift[giftId]
        if v then
            index = index + 1
            for j = 1, #v.reward do
                Grid.makeItem(msgRet.premiumGiftMsg[index].item[j], v.reward[j][1], v.reward[j][2])
            end
            msgRet.premiumGiftMsg[index].item[0] = #v.reward
            msgRet.premiumGiftMsg[index].cnt = absAct.premiumCnt and absAct.premiumCnt[giftId] or 0
            msgRet.premiumGiftMsg[index].id = giftId
            msgRet.premiumGiftMsg[index].maxCnt = v.cnt
            msgRet.premiumGiftMsg[index].icon = v.icon or 0
            msgRet.premiumGiftMsg[index].name = v.name or ""

            local buyID = v.buyID
            msgRet.premiumGiftMsg[index].buyMsg[0] = 0
            msgRet.premiumGiftMsg[index].needItem[0] = 0
            if v.buyID == 0 then
                local len = 0
                for _, item in ipairs(v.needItem) do
                    len = len + 1
                    Grid.makeItem(msgRet.premiumGiftMsg[index].needItem[len], item[1], item[2])
                end
                msgRet.premiumGiftMsg[index].needItem[0] = len
            else
                BuyLogic.fontBuyItem(human, msgRet.premiumGiftMsg[index].buyMsg[1], buyID)
                msgRet.premiumGiftMsg[index].buyMsg[0] = 1
            end
        end
    end
    msgRet.premiumGiftMsg[0] = index
    msgRet.startTime = startTime
    msgRet.endTime = endTime
    Msg.send(msgRet, human.fd)
end

function isRed(human, YYInfo, funcConfig)
    return false
end

function isActive(human, YYInfo, funcConfig)
    return not isOpen(human, YYInfo, funcConfig)
end

function isOpen(human, YYInfo, funcConfig)
    return AbsActLogic.isStarted(human, funcConfig.funcID)
end

function getLeftTime(human, YInfo, funcConfig)
    local ret, endTime, startTime = AbsActLogic.isStarted(human, funcConfig.funcID)
    if ret == true then
        return endTime - os.time()
    else
        return 0
    end
end

function wishGift(human, id, buyConf, isFirst, cnt)
    local state = AbsActLogic.isStarted(human, id)
    local absConfig = AbsActExcel.absActivity[id]
    if absConfig == nil or not state then return end

    -- 存在多个特惠礼包 同时   开放
    local premiumID = ABS_PREMIUM_GIFT_LIST_BUYID[buyConf.id]
    if not premiumID then return end

    local config = AbsActExcel.wishGift[premiumID]
    if not config then return end

    if config.actId ~= absConfig.actId then return end

    AbsActLogic.checkAbsActClean(human, id)

    human.db.absAct[id].premiumCnt = human.db.absAct[id].premiumCnt or { }
    local nowBuyCnt = human.db.absAct[id].premiumCnt[premiumID] or 0

    -- 判断是否达到购买上限
    if nowBuyCnt >= config.cnt then
        Broadcast.sendErr(human, Lang.HERO_BAG_BUY_CAP_NO_CNT)
        return
    end

    -- 当金币购买之后超过最大金币时，不允许购买
    for j = 1, #config.reward do
        local itemID = config.reward[j][1]
        local itemCnt = config.reward[j][2]
        if itemID == ItemDefine.ITEM_JINBI_ID then
            if not ObjHuman.canAddJinbi(human, itemCnt) then
                return
            end
        end
    end

    -- 增加已购买次数
    human.db.absAct[id].premiumCnt[premiumID] = nowBuyCnt + 1
    -- 发放物品
    -- local items = { }
    BagLogic.addItemList(human, AbsActExcel.wishGift[premiumID].reward, "abs_wish_gift_buy")

    Broadcast.sendErr(human, Lang.ITEM_BUY_SUCCESS)
    AbsActLogic.actDetailQuery(human, id)
end

function giftBuy(human, id, premiumID)
    local state = AbsActLogic.isStarted(human, id)
    if state ~= true then return Broadcast.sendErr(human, Lang.ACT_WAS_OVER) end

    local absConfig = AbsActExcel.absActivity[id]
    if not absConfig then return end

    AbsActLogic.checkAbsActClean(human, id)

    -- 存在多个特惠礼包 同时   开放
    local config = AbsActExcel.wishGift[premiumID]
    if config.buyID ~= 0 then return end

    -- 初始化已购买次数
    human.db.absAct[id].premiumCnt = human.db.absAct[id].premiumCnt or { }
    local nowBuyCnt = human.db.absAct[id].premiumCnt[premiumID] or 0
    -- 判断是否达到购买上限
    if nowBuyCnt >= config.cnt then
        Broadcast.sendErr(human, Lang.HERO_BAG_BUY_CAP_NO_CNT)
        return
    end

    for _, item in ipairs(config.needItem) do
        local itemID = item[1]
        local itemCnt = item[2]
        if not BagLogic.checkItemCnt(human, itemID, itemCnt) then
            Broadcast.sendErr(human, Lang.COMMON_NO_ZUANSHI)
            return
        end
    end

    -- 当金币购买之后超过最大金币时，不允许购买
    for j = 1, #config.reward do
        local itemID = config.reward[j][1]
        local itemCnt = config.reward[j][2]
        if itemID == ItemDefine.ITEM_JINBI_ID then
            if not ObjHuman.canAddJinbi(human, itemCnt) then
                return
            end
        end
    end

    for _, item in ipairs(config.needItem) do
        local itemID = item[1]
        local itemCnt = item[2]
        BagLogic.delItem(human, itemID, itemCnt, "abs_wish_gift_reward")
    end



    -- 增加已购买次数
    human.db.absAct[id].premiumCnt[premiumID] = nowBuyCnt + 1
    -- 发放物品
    -- local items = { }
    BagLogic.addItemList(human, AbsActExcel.wishGift[premiumID].reward, "abs_wish_gift_reward")

    Broadcast.sendErr(human, Lang.ITEM_BUY_SUCCESS)
    AbsActLogic.actDetailQuery(human, id)
end